#pragma once
#include "stdio.h"
#include "stdlib.h"

// 循环打印数组
#define FOR(i, end, format, value)                                \
    {                                                             \
        printf("[");                                              \
        for (int i = 0; i < end; ++i) {                           \
            printf((i == end - 1) ? format : format ", ", value); \
        }                                                         \
        printf("]\n");                                            \
    }

// 循环宏
#define For(i, begin, end) for (int i = begin; i < end; ++i)

// 交换两个变量的值
#define SWAP(a, b)      \
    {                   \
        int _temp_ = a; \
        a = b;          \
        b = _temp_;     \
    }

// 交换两个变量的值（通用类型）
#define SWAP_T(a, b, type) \
    {                      \
        type _temp_ = a;   \
        a = b;             \
        b = _temp_;        \
    }

// 返回两个值中的较小值
#define MIN(a, b) (a > b ? b : a)

// 动态分配内存
#define MALLOC(type, n) (type *)malloc(sizeof(type) * (n))

// 动态分配并初始化为0的内存
#define CALLOC(type, n) (type *)calloc(sizeof(type), (n))

// 冒泡排序
void bubble_sort_1(int *arr, int n);

// 冒泡排序（优化版）
void bubble_sort_2(int *arr, int n);

// 冒泡排序（进一步优化版）
void bubble_sort_3(int *arr, int n);

// 选择排序
void select_sort_1(int *arr, int n);

// 选择排序（双向选择版）
void select_sort_2(int *arr, int n);

// 插入排序
void insert_sort(int *arr, int n);

// 希尔排序
void shell_sort(int *arr, int n);

// 堆排序
void heap_sort(int *arr, int n);

// 归并排序
void merge_sort(int *arr, int n);

// 归并排序-非递归
void merge_sort_nor(int *arr, int n);

// 快速排序
void quick_sort_1(int *arr, int n);

// 快速排序（优化版）
void quick_sort_2(int *arr, int n);

// 快速排序-非递归
void quick_sort_nor(int *arr, int n);

// 计数排序
void count_sort(int *arr, int n);

// 计数排序-稳定版
void count_sort_stable(int *arr, int n);